/**给定长度可能不等的数组nums1和nums2，数组中的所有值都在[1,6]之间
 * 选择 任意 数组中的任意一个整数，将它变成 1 到 6 之间 任意 的值
 * 返回使 nums1 中所有数的和与 nums2 中所有数的和相等的最少操作次数
 * @param {number[]} nums1
 * @param {number[]} nums2
 * @return {number}
*/
var minOperations = function (nums1, nums2) {
    // 大数组全部取1 小数组全部取6 还不能相等就返回-1
    if (nums1.length * 1 > nums2.length * 6 || nums2.length * 1 > nums1.length * 6) {
        return -1
    }
    
    // 求和
    let sum1 = eval(nums1.join('+'))
    let sum2 = eval(nums2.join('+'))

    // 计算需要缩小到0的差值
    let target = Math.abs(sum1 - sum2)
    if (target == 0) {
        return 0
    }

    let large = [], small = []
    if (sum1 > sum2) {
        large = [...nums1], small = [...nums2]
    } else {
        large = [...nums2], small = [...nums1]
    }

    // 大数组从大到小排 小数组从小到大排
    large.sort((a, b) => b - a)
    small.sort((a, b) => a - b)

    let i = 0, j = 0, count = 0
    while (target > 0) {
        count++

        // 可以缩小target的最大程度
        let sub1 = Math.abs(large[i] - 1),
            sub2 = Math.abs(6 - small[j])

        // 此时说明一步之内就能完成target=0的目标 直接返回即可
        if (sub1 >= target || sub2 >= target) {
            return count
        }

        // 否则选取缩小target程度大的那个
        if (sub1 >= sub2) {
            target -= sub1
            i++
        } else {
            target -= sub2
            j++
        }
    }
};